package com.penghaisoft.microwms.product.service.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.penghaisoft.microwms.common.Constant;
import com.penghaisoft.microwms.common.dto.ProBarcodeDto;
import com.penghaisoft.microwms.common.dto.Resp;
import com.penghaisoft.microwms.common.dto.TransResult;
import com.penghaisoft.microwms.common.page.Pager;
import com.penghaisoft.microwms.common.service.BaseService;
import com.penghaisoft.microwms.common.wms.model.ProBarcode;
import com.penghaisoft.microwms.common.wms.model.ProCheckIn;
import com.penghaisoft.microwms.common.wms.model.ProStorageSn;
import com.penghaisoft.microwms.product.dao.ProBarcodeMapper;
import com.penghaisoft.microwms.product.dao.ProCheckInMapper;
import com.penghaisoft.microwms.product.dao.ProStorageSnMapper;
import com.penghaisoft.microwms.product.service.IProBarcodeService;

/**
 * @ClassName: ProBarcodeServiceImpl
 * @Description: 成品条码（登记生成）
 * @author luoteng
 * @date 2018年11月5日 上午10:52:43
 */
@Service("proBarcodeService")
public class ProBarcodeServiceImpl extends BaseService implements
		IProBarcodeService {
	@Resource
	private ProBarcodeMapper proBarcodeMapper;

	@Autowired
	private ProStorageSnMapper proStorageSnMapper;

	@Resource
	private ProCheckInMapper proCheckInMapper;

	/**
	 * 新增记录
	 * 
	 * @param baseResource
	 * @return
	 */
	@Override
	public Resp create(ProBarcode proBarcode) {
		proBarcodeMapper.create(proBarcode);
		return success();
	}

	/**
	 * 删除记录（逻辑删除）
	 * 
	 * @param baseResource
	 * @return
	 */
	@Override
	public Resp delete(ProBarcode proBarcode) {
		proBarcodeMapper.delete(proBarcode);
		return success();
	}

	/**
	 * 查询列表
	 * 
	 * @param pager
	 * @param baseResource
	 * @return
	 */
	@Override
	public Pager<ProBarcode> findListByCondition(int page, int rows,
			ProBarcode condition) {
		Pager<ProBarcode> pager = new Pager<>();
		pager.setPage(page);
		pager.setRows(rows);
		condition.preQuery();
		long size = proBarcodeMapper.queryCount(condition);
		List<ProBarcode> records = new ArrayList<ProBarcode>();
		if (size > 0) {
			records = proBarcodeMapper.queryList(pager, condition);
		}
		pager.setRecords(records);
		pager.setTotalCount(size);
		return pager;
	}

	/**
	 * 查询单条
	 * 
	 * @param id
	 * @return
	 */
	@Override
	public ProBarcode findById(String id) {
		return proBarcodeMapper.queryById(id);
	}

	/**
	 * 修改记录
	 * 
	 * @param baseResource
	 * @return
	 */
	@Override
	public Resp update(ProBarcode proBarcode) {
		proBarcodeMapper.updateBySelect(proBarcode);
		return success();
	}

	/**
	 * @Title: scanBarcode
	 * @Description: 成品积压入库扫码入库
	 * @param @param proBarcodeDto
	 * @param @return 参数说明
	 * @return TransResult 返回类型
	 * @author luoteng
	 * @date 2018年11月5日 下午3:00:13
	 * @throws
	 */
	@Override
	public TransResult scanBarcode(ProBarcodeDto proBarcodeDto) {
		TransResult result = new TransResult();
		result.setCode(Constant.SUCCESS);

		Date now = new Date();

		ProBarcode proBarcode = new ProBarcode();
		proBarcode.setBarcode(proBarcodeDto.getBarcode());
		proBarcode.setActiveFlag("1");

		List<ProBarcode> barList = proBarcodeMapper.queryByAny(proBarcode);
		if (barList == null || barList.isEmpty()) {
			result.setCode(Constant.FAIL);
			result.setMsg("该条码不存在，非积压库存管理生成!");
			return result;
		} else if (barList.size() > 1) {
			result.setCode(Constant.FAIL);
			result.setMsg("该条码重复!");
			return result;
		} else {
			ProBarcode tmp = barList.get(0);

			proBarcodeMapper.updateBySelect(tmp);

			if (!tmp.getContractNo().equals(proBarcodeDto.getContractNo())) {
				result.setCode(Constant.FAIL);
				result.setMsg("该条码所属合同号与输入的合同号不符！");
				return result;
			}

			ProStorageSn sn = new ProStorageSn();
			sn.setBarcode(proBarcodeDto.getBarcode());
			sn.setActiveFlag("1");

			List<ProStorageSn> snList = proStorageSnMapper.queryByAny(sn);
			List<ProStorageSn> rtnList = new ArrayList<ProStorageSn>();
			if (snList != null && !snList.isEmpty()) {
				result.setCode(Constant.FAIL);
				result.setMsg("该条码已经入库！");
				return result;
			} else {
				if (isProLength(tmp.getModelType())) {
					if (proBarcodeDto.getAmount() == null) {
						result.setCode(Constant.FAIL);
						result.setMsg("请输入长度！");
						return result;
					}
					// String a = "^\\d+(\\.\\d+)?";
					String b = "[0-9]{1,}(\\.[0-9]{1,})?";
					Pattern pattern = Pattern.compile(b);
					Matcher matcher = pattern.matcher(proBarcodeDto.getAmount()
							.toString());
					Boolean isNt = matcher.matches();
					if (isNt) {
						sn.setAmount(proBarcodeDto.getAmount());
						tmp.setAmount(proBarcodeDto.getAmount());
					} else {
						result.setCode(Constant.FAIL);
						result.setMsg("输入的长度不是数字格式！");
						return result;
					}
					
					sn.setUnit("m");
				} else {
					// 管件长度默认为1
					sn.setAmount(new BigDecimal("1"));
					tmp.setAmount(new BigDecimal("1"));
					sn.setUnit("ge");
				}

				tmp.setLastModifiedBy(proBarcodeDto.getLoginName());
				tmp.setGmtModified(now);
				// 是否合格：0-不合格 1-合格
//				tmp.setUserDefined6(proBarcodeDto.getIsQualified());
				// 不合格原因
//				tmp.setUserDefined7(proBarcodeDto.getNotQualifiedReason());

				rtnList.add(sn);
				result.setList(rtnList);

				// 入库状态：0 未入库 1已入库
				tmp.setUserDefined1("1");
				proBarcodeMapper.updateBySelect(tmp);

				sn.setContractNo(proBarcodeDto.getContractNo());
				sn.setModel(tmp.getModel());
				// sn.setModelDesc(tmp.getModelDesc() == null ? "" :
				// tmp.getModelDesc());
				sn.setModelDesc(tmp.getModelDesc());
				sn.setModelType(tmp.getModelType());
				sn.setType(tmp.getType());
				// 先写默认值，后续再改
				sn.setWlCode(proBarcodeDto.getWlCode());
				// 0可用；1 冻结；2 已出库
				sn.setBarcodeStatus("0");
				sn.setCreateBy(proBarcodeDto.getLoginName());
				sn.setGmtCreate(now);
				// 供应商代码
//				sn.setUserDefined2(tmp.getUserDefined5());

//				MdModel t = new MdModel();
//				t.setModel(tmp.getModel());
//				t.setActiveFlag("1");
//				List<MdModel> modelList = mdModelMapper.queryByAny(t);
//				if (modelList != null && !modelList.isEmpty()) {
//					MdModel tmpModel = modelList.get(0);
//					// 货主（0：本公司 1：外公司）
//					sn.setUserDefined3(tmpModel.getUserDefined3());
//				}

				proStorageSnMapper.create(sn);

				ProCheckIn proCheckIn = new ProCheckIn();
				proCheckIn.setCheckInNo(tmp.getUserDefined2());
				proCheckIn.setModel(tmp.getModel());
				proCheckIn.setActiveFlag("1");

				List<ProCheckIn> ckInList = proCheckInMapper.queryByAny(proCheckIn);
				if (ckInList != null && !ckInList.isEmpty()) {
					ProCheckIn upOb = new ProCheckIn();
					upOb.setCheckInId(ckInList.get(0).getCheckInId());
					upOb.setInAmountAdd(1);
					upOb.setLastModifiedBy(proBarcodeDto.getLoginName());
					upOb.setGmtModified(now);

					proCheckInMapper.updateBySelect(upOb);
				}
			}
		}

		return result;
	}

	/**
	 * @Title: delBarcode
	 * @Description: 成品积压入库退扫条码
	 * @param @param proBarcodeDto
	 * @param @return 参数说明
	 * @return TransResult 返回类型
	 * @author luoteng
	 * @date 2018年11月5日 下午3:00:25
	 * @throws
	 */
	@Override
	public TransResult delBarcode(ProBarcodeDto proBarcodeDto) {
		TransResult result = new TransResult();
		result.setCode(Constant.SUCCESS);

		Date now = new Date();

		ProBarcode proBarcode1 = new ProBarcode();
		proBarcode1.setBarcode(proBarcodeDto.getBarcode());
		proBarcode1.setActiveFlag("1");

		List<ProBarcode> barList1 = proBarcodeMapper.queryByAny(proBarcode1);
		if (barList1 != null && !barList1.isEmpty()) {
			ProBarcode tmp = barList1.get(0);

			if (!tmp.getContractNo().equals(proBarcodeDto.getContractNo())) {
				result.setCode(Constant.FAIL);
				result.setMsg("该条码所属合同号与输入的合同号不符！");
				return result;
			}
		}else{
			result.setCode(Constant.FAIL);
			result.setMsg("该条码非成品积压库存管理生成，不能退扫！");
			return result;
		}

		ProStorageSn sn = new ProStorageSn();
		sn.setBarcode(proBarcodeDto.getBarcode());
		sn.setActiveFlag("1");

		List<ProStorageSn> snList = proStorageSnMapper.queryByAny(sn);
		if (snList == null || snList.isEmpty()) {
			result.setCode(Constant.FAIL);
			result.setMsg("该条码不存在！");
			return result;
		} else {
			ProStorageSn upob = snList.get(0);
			// 0可用；1 冻结；2已出库 3 报废
			if ("1".equals(upob.getBarcodeStatus())) {
				result.setCode(Constant.FAIL);
				result.setMsg("该条码已冻结，不能退扫!");
				return result;
			} else if ("2".equals(upob.getBarcodeStatus())) {
				result.setCode(Constant.FAIL);
				result.setMsg("该条码已出库 ，不能退扫!");
				return result;
			} else if ("3".equals(upob.getBarcodeStatus())) {
				result.setCode(Constant.FAIL);
				result.setMsg("该条码已报废，不能退扫!");
				return result;
			}

			// 查询创建时间
			Date createTime = snList.get(0).getGmtCreate();
			// 与当前相差时间（毫秒）
			long cha = now.getTime() - createTime.getTime();
			// 创建时间晚于当前（数据错误）
			if (cha < 0) {
				result.setCode(Constant.FAIL);
				result.setMsg("时间错误");
				return result;

			}
//			// 相差时间（小时）
//			double timeOut = cha * 1.0 / (1000 * 60 * 60);
//			// 超过24小时
//			if (timeOut > Constant.OUTHOUR) {
//				result.setCode(Constant.FAIL);
//				result.setMsg("该条码已超过退扫时间" + Constant.OUTHOUR + "小时，不能退扫");
//				return result;
//			}

			ProBarcode proBarcode = new ProBarcode();
			proBarcode.setBarcode(proBarcodeDto.getBarcode());
			proBarcode.setActiveFlag("1");

			List<ProBarcode> barList = proBarcodeMapper.queryByAny(proBarcode);
			if (barList != null && !barList.isEmpty()) {
				ProBarcode tmp = barList.get(0);
				// 入库状态：0 未入库 1已入库
				tmp.setUserDefined1("0");
				tmp.setLastModifiedBy(proBarcodeDto.getLoginName());
				tmp.setGmtModified(now);
				// 是否合格：0-不合格 1-合格
//				tmp.setUserDefined6("1");
				// 不合格原因
//				tmp.setUserDefined7(" ");
				proBarcodeMapper.updateBySelect(tmp);

				ProCheckIn proCheckIn = new ProCheckIn();
				proCheckIn.setCheckInNo(tmp.getUserDefined2());
				proCheckIn.setModel(tmp.getModel());
				proCheckIn.setActiveFlag("1");

				List<ProCheckIn> ckInList = proCheckInMapper.queryByAny(proCheckIn);
				if (ckInList != null && !ckInList.isEmpty()) {
					ProCheckIn upOb = new ProCheckIn();
					upOb.setCheckInId(ckInList.get(0).getCheckInId());
					upOb.setInAmountDel(1);
					upOb.setLastModifiedBy(proBarcodeDto.getLoginName());
					upOb.setGmtModified(now);

					proCheckInMapper.updateBySelect(upOb);
				}

			}

			upob.setActiveFlag("0");
			upob.setLastModifiedBy(proBarcodeDto.getLoginName());
			upob.setGmtModified(now);

			proStorageSnMapper.updateBySelect(upob);
		}

		return result;
	}
}
